/***************************************************************************************************
Universidad del Valle de Guatemala
Algoritmos y estructuras de datos
Karen Tojin   08091
Fecha: 23 de Julio de 2009
Hoja de Trabajo No. 2
Descricion: Programa que simula un parqueo, con el uso de pilas y dos diferentes implementaciones
****************************************************************************************************/

/**
 *
 * @author karenAndy
 */
public class ParquearStackArreglo<Type> implements InterfazParqueo {

        private Object[] autos; //Instancia del arreglo
        private int espacioEnUso, disponibles; // tamaño de la lista y elementos disponibles
        private final int max=10; //tamaño máximo de la lista

        
        public ParquearStackArreglo()
        // post: genera un arreglo de 10 posiciones
        {
                autos = new Object[max];
                espacioEnUso = 0;
                disponibles = max;
        }

        @Override
        public void Push(Object newElement) throws ParqueoLlenoException{
            // post: el nuevo elemento es agregado al final del arreglo
            if(this.Full())
                    throw new ParqueoLlenoException("El parqueo esto lleno, espere a que salga algun automovil");
            else{
                    autos[espacioEnUso] = newElement;
                    espacioEnUso++;
                    disponibles--;
            }
        }

        @Override
        public Object Pop() throws ParqueoVacioException{
            // pre: el arreglo no está vacío
            // post: quita y devuelve el último elemento que ingresó al arreglo
            if(this.Empty())
                    throw new ParqueoVacioException("El parqueo esta vacio");

            else{
                    espacioEnUso--;
                    disponibles++;
                     return autos[espacioEnUso];
            }
        }

        
        @Override
        public Object Peek() throws ParqueoVacioException{
            // pre: el arreglo no está vacío
            // post: devuelve el último valor ingresado al arreglo
            if(this.Empty())
                    throw new ParqueoVacioException("El parqueo esta vacio");
            else
                return autos[espacioEnUso-1];
        }

      
        //This Method can be in the abstract class
        @Override
        public boolean Empty() {
            //post: devuelve true si la lista está vacía
            if(disponibles==max)
                    return true;
            return false;
        }

        //This Method can be in the abstract class
        public boolean Full(){
            //post: devuelve true si la lista está llena
            if(disponibles==0)
                    return true;
            return false;
        }

        //This Method can be in the abstract class
        public int Size() {
            //post: devuelve el tamaño de la lista
            return espacioEnUso;
        }

        
        public boolean BuscarAuto(Object elementSearch)throws NoEncontradoException{
            // pre: el elemento buscado no es null
            // post: devuelve true si sí se encontró el elemento
            for(int i=0; i<=(espacioEnUso-1); i++){
                    if((autos[i]).equals(elementSearch)){
                            return true;
                    }
            }
            return false;
        }

        @Override
        public String toString(){
            // post: devuelve la cadena con los elementos del arreglo
            String MostrarElementos=".::Elementos del Parqueo::.\n";
            for(int i=(espacioEnUso-1); i>=0; i--){
                    try{
                            MostrarElementos +=("  "+autos[i].toString()+"\n");
                    } catch (Exception exception){
                            System.out.println(exception);
                    }
            }
            String cantElementos = MostrarElementos+ "\nTotal espacios " + (max-disponibles);
            return cantElementos;
        }
}
